#!/usr/bin/python
# _*_ coding: gbk _*_
'''↑↑↑为适应打包后exe可在windows下执行改变编码，linux下为utf-8'''

# 加载程序所需模块
import re
import requests
import urlparse
import os
import time
import threading
import Queue
import sys

reload(sys)

# 定义默认字符编码
sys.setdefaultencoding('utf-8')

# 定义程序开始时间
start = time.time()

# 定义文件保存路径，确认是否存在，如果不存在则建立
picture_save_path = r'D:/down_picture_tttt/'
if not os.path.exists(picture_save_path):
    os.makedirs(picture_save_path)

class get_picture_url():
    def __init__(self,page):
        self.page = page

    def down_pirce(self):
        # 定义要抓取图片的地址
        url = 'http://jandan.net/ooxx/page-%s#comments' % (self.page)

        # 模仿游览器方式游览地址
        req_header = {'Host':'jandan.net'}
        web_url = requests.get(url, headers=req_header).text.encode('utf-8')

        # 搜索条件 包含img src，结尾是jpg的字段
        search_key = re.compile(ur'img.src="//.*\.jpg')
        find_jpg_url = search_key.findall(web_url)

        # 生成下载文件的地址列表
        for find_key in find_jpg_url:
            key_downurl = 'http://'+find_key[11:]
            down_list.append(key_downurl)

def get_down_picture(SHARE_Q):
    while True:
        try:
            # 不阻塞的读取队列数据
            url = SHARE_Q.get_nowait()
            #print url
            i = SHARE_Q.qsize()
            #print 'this is i',i
        except Exception, e:
            print e
            break;

        img_path = url[-36:]    #拆出文件后缀
        #print 'this is img_path',img_path
        res = requests.get(url, stream=True)    # 呼叫url地址，确认返回值

        if res.status_code == 200:  #如果返回值为 200，则
            save_img_path = '%s%s' % (picture_save_path, img_path)  #组成保存文件的地址，以及文件名
            # 保存下载的图片
            with open(save_img_path, 'wb') as fs:
                for chunk in res.iter_content(1024):
                    fs.write(chunk)
                print '%s 下载完成' % img_path

get_url_b = input("输入开始页码：")
get_url_e = input("输入结束页码：")
down_range = range(get_url_b,get_url_e+1)

#定义要下载列表，默认为空
down_list = []

for i in down_range:
    temp_class = get_picture_url(i)
    temp_class.down_pirce()

# 构造一个不限制大小的队列
SHARE_Q = Queue.Queue()
for url in down_list:
    SHARE_Q.put(url)  # 把下载地址批次放入其中

if __name__ == '__main__':
    print "开始下载"
    # 开多个线程测试不同效果
    t1 = threading.Thread(target=get_down_picture, args=(SHARE_Q, ))
    t2 = threading.Thread(target=get_down_picture, args=(SHARE_Q, ))
    t3 = threading.Thread(target=get_down_picture, args=(SHARE_Q, ))
    #t4 = threading.Thread(target=get_down_picture, args=(SHARE_Q, ))
    t1.start()
    t2.start()
    t3.start()
    #t4.start()
    t1.join()
    t2.join()
    t3.join()
    #t4.join()

    end = time.time()
    print 'Done %s ' %  (end-start)
    # 等待3秒后再推出，便于winodws下可以看到完成时间，而不直接关闭窗口
    time.sleep(3)
